<?php
class DB
{
    /**
     * sql connection link
     *
     * @var SQL Resource
     */
    var $sql_link;
    /**
     * Количество запросов
     *
     * @var int
     */
    var $query_count=0;
    /**
     * Список запросов
     *
     * @var array
     */
    var $query_list;
    /**
     * конфиг к базе данных
     *
     * @var array
     */
    var $config;
    
    /**
     * конструктор базы
     *
     * @return DB
     */
    function DB()
    {
    	global $cfg;
    	$this->config=&$cfg['db'];
    }
    
    /**
     * Получаем экземпляр базы данных
     *
     * @static 
     * @return DB
     */
    function &Instance()
    {
    	static $db;
    	if (!$db)
    	{
    		$db=new DB();
    	}
		return $db;
    }
    
    /**
     * подключаемся к базе данных
     *
     * @param array('host','user','password','database','codepage') $db_param
     */
    function Connect($db_param=NULL)
    {
    	if (!$db_param || !is_array($db_param))
    	{
    		$db_param=$this->config;
    	}
    	var_export($db_param);
    	$this->sql_link=mysql_connect($db_param['host'],$db_param['user'],$db_param['password']);
    	if (!$this->sql_link)
    	{
    		trigger_error('Can\'t connect to server',E_USER_ERROR);
    	}
    	
        if (isset($db_param['database']))
        {
            $this->SetDB( $db_param['database'] );
        }
        if (isset($db_param['codepage']))
        {
			$this->SetCodepage($db_param['codepage']);
        }
    }
    
    /**
     * устанавливане кодировку для работы с базой
     *
     * @param string $codepage UTF8, cp1251 и т.д.
     */
    function SetCodepage($codepage)
    {
    	$this->Query("SET CHARACTER SET '".$codepage."'");
    }
    
    /**
     * устанавливаем SQL link
     *
     * @param resource $sql_link
     */
    function SetSqlLink($sql_link)
    {
    	$this->sql_link=&$sql_link;
    }
    
    /**
     * устанавливаем коннетк базе данных
     *
     * @param string $database
     */
    function SetDB($database)
    {
    	mysql_select_db($database,$this->sql_link) or trigger_error(mysql_error(),E_USER_ERROR);
    }
    
    /**
     * делаем запрос
     *
     * @param string $query_string
     * @return Query_unit
     */
    function Query($query_string)
    {
    	if (!$this->sql_link)
    	{
    		$this->Connect();
    	}
        $this->query_count++;
        $this->query_list[]=$query_string;
        $tmp=new Query_unit($query_string,&$this->sql_link);
        return $tmp;
    }
    
    /**
     * возвращает Id вставленного элемента
     *
     * @return int
     */
    function InsertId()
    {
        return mysql_insert_id($this->sql_link);
    }

	/**
	 * возвращает количество запросов
	 *
	 * @return int
	 */
    function GetQueryCount()
    {
    	return $this->query_count;
    }
    
    /**
     * возвращает массив с запросами 
     *
     * @return array
     */
    function GetQueryList()
    {
		return $this->query_list;    	
    }
    
    /**
     * возвращает количество задействованных строк
     *
     * @return int
     */
    function Affected()
    {
		return mysql_affected_rows();    	
    }
}


/**
 * делает mysql запрос и содержит в себе его ответ
 *
 */
class Query_unit
{
    
    /**
     * содержит mysql result
     *
     * @var resource
     */
    var $result;
    
    
    function Query_unit($query_string,$sql_link)
    {
        //$query_string=mysql_escape_string($query_string);
        $query_string=preg_replace("/`\{([a-z_0-9]+)\}`/i","`site_\\1`",$query_string);
        $this->result=mysql_query($query_string,$sql_link);
        if (mysql_error())
        {
            trigger_error(mysql_error()."\n".$query_string,E_USER_ERROR);
        }
    }
    
    /**
     * получаем объект
     *
     * @return object
     */
    function FetchObject()
    {
        return mysql_fetch_object($this->result);
    }
    
    /**
     * получаем ассоциативный массив
     *
     * @return array
     */
    function FetchArray()
    {
    	return mysql_fetch_assoc($this->result);
    }
    
    /**
     * возвращает количество строк в запросе
     *
     * @return int
     */
    function NumRows()
    {
        return mysql_num_rows($this->result);        
    }
    
    /**
     * получаем двумерный массив
     *
     */
    function Fetch($assoc=NULL,$callback_function=NULL)
    {
    	$res=array();
    	while ($r=$this->FetchObject())
    	{
    		if ($callback_function)
    		{
    			$r=$callback_function($r);
    		}
    		if ($assoc)
    		{
    			$res[ $r->$assoc ]=$r;	
    		}
    		else
    		{
    			$res[]=$r;
    		}
    	}
    	return $res;
    }
}
?>